AWS Transfer FamilyとMSADでFTP環境を構築してみる
こんにちは、AWS事業本部のニシヤマです。
先日、Transfer FamilyでFTP対応サーバーの作成をする機会があったので備忘録も兼ねてご紹介します。
注意点
プロトコルFTPの場合、ID プロバイダーは以下の2つから選択が可能です。
- AWS Directory Service for Microsoft Active Directory (MSAD)
- カスタム ID プロバイダー
また、パブリックにアクセス可能なエンドポイントはサポートされていません。
前提
すでに図の様な構成のVPCとMSADが作成され、ドメインに参加させたWindowsサーバからActive Directoryの操作可能な状態であること。
MSADの立ち上げと、Windowsサーバのドメイン参加は以下を参照してください。
AWS Directory Service(Microsoft AD)でActive Directoryを立ててWindowsを参加させる
やってみる
では上記構成の環境構築が完了している状態から始めます。
FTPサーバ専用のセキュリティグループを作成
後でも作成は可能ですが事前にFTPサーバ専用のセキュリティグループを作成します。
インバウンドルールですが以下のドキュメントにある通り21番(コントロールチャネル)と、8192-8200(データチャネル)を許可します。今回はVPC内から許可するように設定します。
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/create-server-ftp.html
Transfer Family 用の FTP サーバは、ポート 21(コントロールチャネル)およびポート範囲 8192-8200(データチャネル)で動作します。
作成手順は省略しますが以下のセキュリティグループを作成しました。
FTP用のActive Directoryのグループの作成
次にActive DirectoryでFTP用ユーザを作成します。Transfer FamilyでFTPを利用する場合、グループのSIDが必要になるのでまずはドメインに参加させたEC2インスタンスでActive Directory ユーザーとコンピューター
を起動しFTPユーザ用グループを作成します。
以下のドキュメントの開始する前に
に記載の通り、PowerShell コマンドを使用して、グループのSIDを取得しておきます。後で利用するのでSIDは控えておいてください。
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/directory-services-users.html
FTP用のActive Directoryのユーザの作成
次にFTP用のユーザを作成し、上記で作成したFTPユーザ用グループに追加します。今回はftpuser1
というユーザを作成しグループに追加しました。
以上でFTPユーザの作成が完了です。
保存先がEFSの場合
Transfer Familyの場合、アップロードしたファイルの保存先にS3バケットとEFSを選択が可能です。 まずは保存先にEFSを選択する手順をご紹介します。
EFSの作成方法は以下を参照してください。
EFSの作成が完了しました。
FTP用ユーザのIAMロール作成
Transfer Familyのユーザのアクセス権限に関してはIAMロールを利用する為、FTPユーザ用にIAMロールを作成します。
こちらの作成手順も省略しますが信頼されたエンティティでtransfer.amazonaws.com
を選択、また今回ポリシーはAmazonElasticFileSystemClientFullAccess
をアタッチして作成します。
FTPサーバを作成
それではTransfer Familyの設定を行っていきます。Transfer Familyの画面でサーバの作成
をクリックします。
プロトコルを選択で「FTP」を選択して次へをクリックします。
ID プロバイダーを選択の画面でAWS Directory Serviceを選択し、事前に作成しておいたMSADのを選択し次へ
をクリックします。
エンドポイントを選択の画面では以下のパラメータを指定して次へ
をクリックします。
- エンドポイントのタイプ:VPC でホスト
- アクセス:内部
- VPC:事前に作成していたVPC ID
- アベイラビリティーゾーン:任意のAZにチェックを入れサブネットを指定
- セキュリティグループ:FTPサーバ専用のセキュリティグループを指定
ちなみに、エンドポイントのタイプのパブリックアクセスや、アクセスでインターネット向けを指定すると以下の様にFTPが利用できないエラーが表示されます。
ドメインを選択ではAmazon EFSを選択し次へ
をクリックします。
次の画面でも次へ
をクリックします。
最後に確認画面でサーバを作成
をクリックします。
少し待つとサーバの作成ができました。
ただし、ユーザの列でアクセスなしとなっているのでサーバIDをクリックして詳細画面に移動します。
サーバの詳細画面でアクセスの項目のアクセスの追加
をクリックします。
この画面では以下の情報を入力して、追加
をクリックします。
- SID:FTP用のActive DirectoryのグループのSID
- ユーザー ID:アップロードしたファイルのユーザーID ※今回はec2-userと同じ1000を指定
- グループ ID:アップロードしたファイルのグループID ※今回はec2-userと同じ1000を指定
- ロール:作成したFTP用ユーザのIAMロール
- ホームディレクトリ:保存先のEFSと、ユーザのホームディレクトリに指定するパスを入力
- 制限付き:ユーザをホームディレクトリより上位階層への移動を制限する場合はチェックする
アクセスの項目に情報が追加されました。
FTPでアクセスしてみる
それでは実際にFTPでアクセスしてみます。今回はVPC内にAmazon Linux 2のEC2を起動して確認してみます。
ホームディレクトリの作成
FTPでアクセスするにあたりアクセスの追加で設定したホームディレクトリを作成する必要があります。EFSをマウントしディレクトリを作成します。ディレクトリの所有者をアクセスの追加で設定したユーザID、グループIDで指定したユーザに変更します。 EFSのマウントに関しては以下を参照して下さい。
$ sudo mkdir /mnt/efs-mount-point $ sudo sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-0d32cc9ca2cc6f831.efs.ap-northeast-1.amazonaws.com:/ /mnt/efs-mount-point $ sudo mkdir /mnt/efs-mount-point/ftpuser1 $ sudo chown ec2-user:ec2-user /mnt/efs-mount-point/ftpuser1 $ sudo ls -ld /mnt/efs-mount-point/ftpuser1 drwxr-xr-x 2 ec2-user ec2-user 6144 11月 16 16:55 /mnt/efs-mount-point/ftpuser1
FTPでアクセス
これでやっと準備ができました。それではFTPでアクセスしたいと思います。
アクセスするFTPサーバのDNS名はVPCエンドポイントのDNS名を利用するので、サーバ詳細画面のリンクから確認します。
$ ftp vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com Trying 10.0.11.118... Connected to vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com (10.0.11.118). 220 Service ready for new user. Name (vpce-00938b393feca6853-t1r0xlx1.vpce-svc-0c6fc1c14ceb5b0d8.ap-northeast-1.vpce.amazonaws.com:ec2-user): ftpuser1 331 User name okay, need password for ftpuser1. Password: 230 User logged in, proceed. Remote system type is UNIX. ftp> pwd 257 "/fs-0d32cc9ca2cc6f831/ftpuser1" is current directory.
サーバに接続できました!FTPで適当なファイルをアップロードしてみます。以下ドキュメントにも記載の通りFTPの場合バイナリモードのみがサポートされているためモード変更してからアップロードしてください。
https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-file.html
FTP および FTPS では、イメージ/バイナリモードのみがサポートされています。
ftp> !ls ftp_upload_file.txt ftp> bin 200 Command TYPE okay. ftp> put ftp_upload_file.txt local: ftp_upload_file.txt remote: ftp_upload_file.txt 227 Entering Passive Mode (10,0,11,118,32,8) 150 File status okay; about to open data connection. 226 Transfer complete. 13 bytes sent in 4.7e-05 secs (276.60 Kbytes/sec) ftp> ls -l 227 Entering Passive Mode (10,0,11,118,32,5) 150 File status okay; about to open data connection. -rw-rw-rw- 1 1000 1000 13 Nov 16 17:20 ftp_upload_file.txt 226 Closing data connection.
アップロードできました!マウントしているターミナルからも確認してみます。
$ ls -l /mnt/efs-mount-point/ftpuser1/ 合計 4 -rw-rw-rw- 1 ec2-user ec2-user 13 11月 16 17:20 ftp_upload_file.txt
確認できました。ダウンロードも確認してみます。
ftp> ls -l 227 Entering Passive Mode (10,0,11,118,32,2) 150 File status okay; about to open data connection. -rw-rw-r-- 1 1000 1000 52 Nov 16 17:27 ftp_download_file.txt -rw-rw-rw- 1 1000 1000 13 Nov 16 17:20 ftp_upload_file.txt 226 Closing data connection. ftp> get ftp_download_file.txt local: ftp_download_file.txt remote: ftp_download_file.txt 227 Entering Passive Mode (10,0,11,118,32,0) 150 File status okay; about to open data connection. 226 Transfer complete. 52 bytes received in 0.152 secs (0.34 Kbytes/sec) ftp> !ls ftp_download_file.txt ftp_upload_file.txt
ダウンロードもできました。
保存先がS3バケットの場合
せっかくなので保存先をS3バケットにした場合も確認してみます。FTPサーバを作成の手順のドメインを選択でS3バケットを選択します。
アクセスの追加の画面ではSIDと、IAMロール、ホームディレクトリでアップロード先のS3バケットを指定します。 ホームディレクトリでパスを指定した場合は事前にS3バケット上にフォルダを作成しておいて下さい。
また、FTP用ユーザのIAMロールにはS3バケットへのアクセス権限を付与しておいてください。では先ほどと同じようにVPCエンドポイントからDNS名を確認し、FTPでアクセスしてアップロードしてみます。
ftp> bin 200 Command TYPE okay. ftp> put ftp_upload_file.txt local: ftp_upload_file.txt remote: ftp_upload_file.txt 227 Entering Passive Mode (10,0,12,208,32,4) 150 File status okay; about to open data connection. 226 Transfer complete. 13 bytes sent in 3.5e-05 secs (371.43 Kbytes/sec) ftp> ls -l 227 Entering Passive Mode (10,0,12,208,32,0) 150 File status okay; about to open data connection. -rwxr--r-- 1 - - 13 Nov 16 17:45 ftp_upload_file.txt 226 Closing data connection.
S3バケットへのアップロードもできてます!
ftp> ls 227 Entering Passive Mode (10,0,12,208,32,8) 150 File status okay; about to open data connection. -rwxr--r-- 1 - - 13 Nov 16 17:45 ftp_upload_file.txt -rwxr--r-- 1 - - 61690 Nov 16 17:48 s3_ftp_download_file.txt 226 Closing data connection. ftp> get s3_ftp_download_file.txt local: s3_ftp_download_file.txt remote: s3_ftp_download_file.txt 227 Entering Passive Mode (10,0,12,208,32,0) 150 File status okay; about to open data connection. 226 Transfer complete. 61690 bytes received in 0.721 secs (85.58 Kbytes/sec) ftp> !ls -l 合計 132 -rw-rw-r-- 1 ec2-user ec2-user 61690 11月 16 17:47 ftp_download_file.txt -rw-rw-r-- 1 ec2-user ec2-user 13 11月 16 17:16 ftp_upload_file.txt -rw-rw-r-- 1 ec2-user ec2-user 61690 11月 16 17:50 s3_ftp_download_file.txt
S3バケットからダウンロードもできました!
以上です。
まとめ
いかがでしたでしょうか。以前CentOS7でFTPサーバ構築をした時に比べ、ちょっと大掛かりではありましたがマネージドサービスだけでFTP環境を構築できるのは便利ですね。まだまだFTPを利用するシステムもあるかと思いますのでAWSとのファイル連携の際などに参考にしてみてください。